iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
1
自我挑戰組

從python入門到物聯網系列 第 12

Day12 - 檔案 I/O

  • 分享至 

  • xImage
  •  

讀取檔案

在python可以處理文字檔中的資訊,可以一次讀取全部的內容,也可以一行一行的讀取。

Python內建函式open()可以開啟指定檔案,可以讀取、寫入和修改檔案內容。

  • open():開啟檔案:
    語法:
open(filename[,mode])
  • filename:
    filename 要讀寫的檔案名稱 (字串型態、不可省略)。

  • mode:
    mode 開啟檔案的模式 (字串型態、可以省略,預設為讀取r)。
    通常都是用r、w、a來控制。

檔案讀寫模式如下:

字元 說明
r 只讀取檔案(唯讀)。檔案必須存在。
r+ 讀取寫入檔案(讀寫)。不會新建檔案,檔案必須存在,寫入會覆蓋原本內容。
w 新建寫入檔案(只寫)。文件內容清零。
w+ 新建讀取寫入檔案(讀寫)。文件內容清零。
a 寫入檔案(只寫)。新增在檔案後面,不會覆蓋原本的。
a+ 允許新增與讀取(讀寫)。新增在檔案後面,不會覆蓋原本的。
  • close():關閉檔案,關閉後就不能進行讀寫動作。

寫入檔案

# 使用w+
f = open("test.txt", "w+")
f.write( "123\n")
f.close()

# 使用r+
f = open("test.txt", "r+")
f.write( "456\n")
f.close()

# 使用a+
f = open("test.txt", "a+")
f.write( "789\n")
f.close()

這時候就會出現一個txt檔案,來看一下內容吧!

所以可以知道 r+ 是會覆蓋檔案,a+ 則是附加在檔案後面!
再來試試輸入一次試試看r+如何覆蓋檔案。

# 使用w+
f = open("test.txt", "w+")
f.write( "try123\n")
f.close()

# 使用r+
f = open("test.txt", "r+")
f.write( "456\n")
f.close()

# 使用a+
f = open("test.txt", "a+")
f.write( "789\n")
f.close()

結果:

r+寫入了123\n 一共是4個元素,並且加在檔案最前面,
因此他蓋掉了w+ 的前4個元素,所以就只剩下23

檔案處理

來創建個簡單的txt檔案吧!

檔名= hello.txt
Hello
World
123
456
789

把檔案讀取進來後,接著就是將檔案內容放進變數裡。
這裡有五種方法:

  • read()
  • readline()
  • readlines()
  • ITER
  • linecache.getline()
  1. read([size])方法:
    size 可以指定要讀取多少字元,沒指定就是讀取全部。
    範例:
f = open('hello.txt', 'r')

lines = f.read() #沒指定size
print(lines)
print(type(lines))

f.close()

結果:

Hello
World
123
456
789
<class 'str'>

指定size(10)=>印出前10個字元
範例:

f = open('hello.txt', 'r')
lines1 = f.read(10)  
print(lines1)

f.close()

結果:

Hello
Worl
  1. readline()方法:
    每次讀一行 => 讀取時佔用記憶體小,比較適合大檔案。
    範例:
    replace('\n','') 將換行符號去掉
f = open('hello.txt', 'r')
line = f.readline().replace('\n','') #去掉換行

while line:
	print(line)
	line = f.readline().replace('\n','') #去掉換行

f.close()

結果:

Hello

World

123

456

789
  1. readlines()方法:
    讀取整個檔按內容,儲存在list串列中,一行為一個元素,讀取大檔案會比較佔記憶體。
    使用with則不須使用f.close()
    範例:
with open('hello.txt','r') as f:
    lines = f.readlines()
print(lines)

或者

f = open('hello.txt', 'r')
lines = f.readlines()

print(lines)

f.close() #a沒有使用with就需要關閉檔案

上面兩個方法的結果是一樣的:

['Hello\n', 'World\n', '123\n', '456\n', '789']

\n => 換行指令也會一起存。

將List內容分別印出:

for line in lines:
	#line = line.split('\n')[0] #去掉換行
	line = line.replace('\n','') #去掉換行
	print(line)

split('\n')[0],去掉換行之後取List[0]的值
replace('\n',''),去掉換行

結果:

Hello
World
123
456
789
  1. ITER
    with方法類似,印出的結果也一樣
    方法:
f = open('hello.txt', "r")
for line in iter(f):
    print(line)
f.close()

結果:

Hello

World

123

456

789
  1. linecache.getline()`
    使用linecache模組,輸出檔案的第n行:
import linecache

line = linecache.getline('hello.txt',2)
print(line)

結果:

World
參考資料

王者歸來:精通物聯網及Python / 作者: 劉凱


上一篇
Day11 - Python 如何處理 JSON
下一篇
Day13 - Python函數
系列文
從python入門到物聯網30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
akajoke
iT邦新手 5 級 ‧ 2023-01-05 14:22:27

好文推個

我要留言

立即登入留言